// ActionScript file
package sww
{
      import flash.events.Event;
      import flash.events.MouseEvent;
      
      import mx.core.Application;
      import mx.core.IMXMLObject;
      import mx.managers.PopUpManager;
      import mx.messaging.Consumer;
      import mx.messaging.Producer;
      import mx.messaging.messages.AsyncMessage;
      import mx.messaging.messages.IMessage;
      
      import sww.dto.NoteData;
      
	public class StickyNoteLogic implements IMXMLObject{
      
      private static const OP_STICKY:String = "sticky";
      private const SIZE_DRAGAREA:int = 5;
      private const SIZE_MIN_WIDTH:int = 40;
      private const SIZE_MIN_HEIGHT:int = 30;

      private var blDragTop:Boolean = false;
      private var blDragRight:Boolean = false;
      private var blDragBottom:Boolean = false;
      private var blDragLeft:Boolean = false;
      private var iDragPosHeight:int = 0;
      private var iDragPosWidth:int = 0;       

      private var myproducer:Producer;
      private var myconsumer:Consumer;
      private var view:StickyNote;
      private var flgChild:int = 0
           
      /**
      * <dd>コンストラクタ
      * @param document 	このLogicのViewであるmxml
      * @param id 		このターゲットの ID 
      * @return 			なし
      */
      public function initialized(document:Object, id:String):void 
      {   
      	view = document as StickyNote;  
      }
      
      /**
      * <dd>送信用オブジェクトセット
      * @param parentProducer 	親画面から受け取った送信用オブジェクト
      * @return 					なし
      */
      public function set producer(parentProducer:Producer):void
      {
      	this.myproducer = parentProducer;
      }
      
      /**
      * <dd>受信用オブジェクトセット
      * @param parentProducer 	親画面から受け取った受信用オブジェクト
      * @return 					なし
      */
      public function set consumer(parentConsumer:Consumer):void
      {
      	this.myconsumer = parentConsumer;
      }
      
 
      
      /**
      * <dd>ページ作成完了
      *	<dd>mxml作成完了時に呼び出されるメソッド。
      *<dd>親画面に付箋移動のリスナをセットする。
      * @param 		なし
      * @return 		なし
      */  
      public function onThis_creationComplete():void
      {
        // 親画面にmouseUpとmouseMoveイベントを追加
        Application.application.parent.addEventListener(MouseEvent.MOUSE_UP, onParent_mouseUp);
        Application.application.parent.addEventListener(MouseEvent.MOUSE_MOVE, onParent_mouseMove);      
      }

      /**
      * <dd>マウス押下
      *	<dd>マウス押下時に呼び出されるメソッド。
      * <dd>移動元座標をセット
      * @param 		なし
      * @return 		なし
      */ 
      public function onThis_mouseDown(event:MouseEvent):void
      {
        // check Top pos
        if( event.localY < SIZE_DRAGAREA )
        {
          blDragTop = true;
          iDragPosHeight = event.localY;
        }

        // check Right pos
        if( view.width - SIZE_DRAGAREA < event.localX )
        {
          blDragRight = true;
          iDragPosWidth = view.width - event.localX;
        }

        // check Bottom pos
        if( view.height - SIZE_DRAGAREA < event.localY )
        {
          blDragBottom = true;
          iDragPosHeight = view.height - event.localY;
        }
        
        // check Left pos
        if( event.localX < SIZE_DRAGAREA )
        {
          blDragLeft = true;
          iDragPosWidth = event.localX;
        }
      }

      public function onParent_mouseMove(event:MouseEvent):void
      {
        doDrag(event.stageX, event.stageY);
      }

      public function onThis_mouseMove(event:MouseEvent):void
      {
        doDrag(event.stageX, event.stageY);
      }

      public function onParent_mouseUp(event:MouseEvent):void
      {
        outDragMode();
      }

      public function onThis_mouseUp(event:MouseEvent):void
      {
        outDragMode();
      }
      
      public function onThis_close():void
      {
        PopUpManager.removePopUp(view);
      }

	  /**
      * <dd>マウスドラッグ
      *	<dd>マウスドラッグ時に呼び出されるメソッド。
      * <dd>テキストボックス移動
      * @param 		なし
      * @return 		なし
      */
      private function doDrag(intX:int, intY:int):void
      {
        if( blDragTop )
        {
          if( view.y + view.height - intY + iDragPosHeight > SIZE_MIN_HEIGHT )
          {
            view.height = view.y + view.height - intY + iDragPosHeight;
            view.y = intY - iDragPosHeight;
          }
          else
          {
            view.y = view.y + view.height - SIZE_MIN_HEIGHT;
            view.height = SIZE_MIN_HEIGHT;
          }
        }

        if( blDragRight )
        {
          if( intX - view.x + iDragPosWidth > SIZE_MIN_WIDTH )
          {
            view.width = intX - view.x + iDragPosWidth;
          }
          else
          {
            view.width = SIZE_MIN_WIDTH;
          }
        }
        
        if( blDragBottom )
        {
          if( intY - view.y + iDragPosHeight > SIZE_MIN_HEIGHT )
          {
            view.height = intY - view.y + iDragPosHeight;
          }
          else
          {
            view.height = SIZE_MIN_HEIGHT;
          }
        }
        
        if( blDragLeft )
        {
          if( view.x + view.width - intX + iDragPosWidth > SIZE_MIN_WIDTH )
          {
            view.width = view.x + view.width - intX + iDragPosWidth;
            view.x = intX - iDragPosWidth;
          }
          else
          {
            view.x = view.x + view.width - SIZE_MIN_WIDTH;
            view.width = SIZE_MIN_WIDTH;
          }
        }
        
      }
      
      private function outDragMode():void
      {
        blDragTop = blDragRight = blDragBottom = blDragLeft = false;
        //送信メソッド呼び出し
      	doSend();
      }
      
      public function onThis_Change(event:Event):void
      {
      	//送信メソッド呼び出し
      	trace(view.myTextBox.text);
      	doSend();
      	trace("text_change!!");
      }
      
      /**
      * <dd>送信メソッド
      * <dd>ユーザ名・位置・大きさ・テキスト・固有番号を
      * <dd>メッセージに入れて送信する。
      * @param 		なし
      * @return 		なし
      */ 
      private function doSend():void
      {
      	if (myconsumer.subscribed && view.flgchild == 0)
      	{
	      	//ユーザ名・位置・大きさ・テキスト・固有番号をセット
	      	var localNote:NoteData = new NoteData();
	      	localNote.NoteProperties(view.num, 
	      	                         view.height,
	      	                         view.width,
	      	                         view.x,
	      	                         view.y,
	      	                         view.myTextBox.text);	      	
	       
	    	var msg:IMessage = new AsyncMessage();
		    msg.body = localNote;
		    msg.headers["operation"] = OP_STICKY;
		    msg.headers["page"] = view.page;
		    msg.headers["room"] = view.room;
		    msg.headers["user"] = view.title;
		    myproducer.send(msg);
      	}      	
      }     
      
	}   
      
}